<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        var num = [1, 15, 20, 1, 32, 7, 3, 1, 2, 7, 4, 7, 9];
        //indexOf方法1
        //准备一个空数组   遍历原数组(三种遍历方法)  
        // 挨个判断原数组的每个元素是否在新数组中 不在 就把元素加进去 
        // 新数组中最后一定是唯一的元素  
        var data = [];
        for (var k of num) {
            if (data.indexOf(k) == -1) {
                data.push(k);
            }
        }
        console.log(data)




        //第二种 快速排序  递归  splice
        // 前后比较   如果相同 删除后一个  
        // 前提 得先排序   只有排序才能把相同的挨在一起

        function quicksort(arr) {
            //选择数组中的一个值作为基准，将数组中小于该值的数置于该数之前
            //大于该值的数置于该数之后，接着对该数前后的两个数组进行重复操作直至排序完成。
            if (arr.length <= 1) {
                return arr;
            }
            var point = arr[arr.length - 1];//以最后一个为基准值
            var left = [], right = [];
            for (var i = 0; i < arr.length - 1; i++) {
                if (arr[i] < point) {
                    left.push(arr[i])
                }
                else { right.push(arr[i]) }

            }
            return quicksort(left).concat(point, quicksort(right))
        }
        var res = quicksort(num)
        for (var i = 0; i < res.length - 1; i++) {
            if (res[i] == res[i + 1]) {
                res.splice(i, 1);
                i--;//防数组塌陷
            }
        }
        console.log(res)

        //第三种 
        // 数组.indexOf(元素,从哪个位置开始往后查找)
        // 返回元素第一次出现的位置  找不到返回-1
        // 始终从下一个元素到最后 查找这个元素是否在这个范围内
        //返回-1说明该元素没有第二个了，不返回-1说明值重复需要删除
        for (var i = 0; i < num.length - 1; i++) {

            var index = num.indexOf(num[i], i + 1);

            if (index != -1) {
                num.splice(index, 1);
                i--//防数组塌陷
            }
            /* var index = num.lastIndexOf(num[i], i + 1);

            if (index != -1) {
                num.splice(index, 1);
                i--
            } */
        }
        console.log(num)


        // 第四种方法    使用集合数据结构 ES6新增 
        // 集合里边的元素 一定唯一的
        // 数组转成集合  集合再转回数组 


        //先把数组放到集合中，
        var s = new Set(num);
        console.log(s);
        //集合转换成数组1
        var res1 = Array.from(s);
        console.log(res1);
        //集合转换成数组2
        // 把集合中的数据 取出来  然后放到空数组中
        // ... 展开运算符
        // 可以展开数组  可以展开对象 可以展开集合 可以展开 map
        var data = [...s]
        console.log(data);


        /* var obj = {'k6':'v6','a':'b'}
       var obj1 = {'k1':'v1','k2':'v2','k3':'v3','k4':'v4','d':'e'}
       var obj2 = {...obj,...obj1}
       console.log(obj2)
       var num1 = [1,2,3]
       var num2 = [4,5,6]
       var num3 = [...num1,...num2]
       console.log(num3) */



        //第五种方法    filter+indexof
        function unique(arr) {
            return arr.filter(function (item, index, arr) {
                //当前元素，在原始数组中的第一个索引==当前索引值，否则返回当前元素
                return arr.indexOf(item, 0) === index;
            });
        }
        var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
        console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, "NaN", 0, "a", {…}, {…}]


    </script>
</body>

</html>